home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 25
/
AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso
/
Updates
/
HD-Installer
/
jst_dev
/
sources
/
src
/
DiskTools
/
corewfiles.asm
< prev
next >
Wrap
Assembly Source File
|
2000-04-12
|
2KB
|
149 lines
; *** Core Design disk utility V1.0
; *** Written by Jean-François Fabre
include "libs.i"
include "macros.i"
XREF _SysBase
XDEF _WriteFiles
XDEF @WriteFiles
; *** create several files from the disk image
; *** very intricate routine, sorry
; in: A0/stack: diskfile buffer
; out D0: error flag (0=OK)
_WriteFiles:
move.l 4(A7),A0
@WriteFiles:
movem.l D1-A6,-(sp)
move.l A0,DiskBuffer
lea dosname,A1
moveq #0,D0
move.l _SysBase,A6
JSRLIB OpenLibrary
move.l D0,dosbase
beq WF_UN_Error
move.l DiskBuffer,A0
lea $200(A0),A2 ; for directory block list, constant
wfloop$:
tst.b (A2)
beq WF_OK ; end
; *** get the file size and first sector
moveq.l #0,D4
moveq.l #0,D5
move.l ($10,A2),D6 ; file size
move.w ($14,A2),D4 ; track
move.w ($16,A2),D5 ; sector
; ** open the first file
move.l A2,D1 ; pointer on the file name to create
lea ($20,A2),A2 ; for next time
move.l #MODE_NEWFILE,D2
move.l dosbase,A6
movem.l D1-A6,-(sp)
JSRLIB Open ; open a new file
movem.l (sp)+,D1-A6
move.l D0,FHandle
beq WF_CF_Error
loop2$
; *** get offset for a sector
bsr GetOffset
moveq.l #0,D4
moveq.l #0,D5
move.w (A3)+,D4
move.w (A3)+,D5 ; next track/sector
move.l #$1FC,D3 ; length if file still to read
cmp.l D3,D6
bcc writewhole$
move.l D6,D3 ; only writes D6 bytes (<$1FC)
writewhole$
; *** write some data to the file
move.l FHandle,D1
move.l A3,D2 ; buffer
move.l dosbase,A6
movem.l D1-A6,-(sp)
JSRLIB Write
movem.l (sp)+,D1-A6
sub.l D3,D6 ; length remaining to be read
beq close$
bcc loop2$
; *** close the file
close$
move.l FHandle,D1
move.l dosbase,A6
movem.l D1-A6,-(sp)
JSRLIB Close
movem.l (sp)+,D1-A6
clr.l FHandle
bra wfloop$
WF_OK:
moveq.l #0,D0
WF_Exit:
move.l dosbase,D1
beq fuck$
move.l D1,A1
move.l _SysBase,A6
JSRLIB CloseLibrary
move.l #0,dosbase
fuck$
movem.l (sp)+,D1-A6
rts
WF_CF_Error:
moveq.l #-1,D0
bra WF_Exit
WF_UN_Error:
moveq.l #-2,D0
bra WF_Exit
WF_DC_Error:
moveq.l #-3,D0
bra WF_Exit
WF_AM_Error:
moveq.l #-5,D0
bra WF_Exit
GetOffset:
move.l A0,A3
subq.l #1,D4 ; because we did not rip track 0 (dos boot)
mulu #$B,D4 ; 1 track = 11 sectors
add.l D5,D4
lsl.l #8,D4 ; * $100
add.l D4,D4 ; * $200: offset in bytes
add.l D4,A3
rts
filesize:
dc.l 0
DiskBuffer:
dc.l 0
FHandle:
dc.l 0
dosbase:
dc.l 0
dosname:
dc.b "dos.library",0